package com.xiaotu.storage;

import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.xiaotu.common.exception.SpiderException;
import com.xiaotu.common.exception.SpiderExceptionCode;
import com.xiaotu.common.model.SpiderLogModel;
import com.xiaotu.common.util.CacheHandler;
import com.xiaotu.common.util.SepratorUtil;
import com.xiaotu.common.util.StringUtil;
import com.xiaotu.storage.model.CacheDataModel;

import net.sf.json.JSONObject;

/**
 * @类名 ACSVStorageProcessor
 * @日期 2017年2月20日
 * @作者 高海军
 * @功能 将redis中的数据写入csv文件的处理类
 */

public abstract class ACSVStorageProcessor
{
	protected static long BATCH_SIZE = 1000;
	
	@Autowired
	protected CacheHandler cacheHandler;
	
	private SpiderLogModel taskLog;
	
	/**
	 * 批量获取缓存数据（按照指定的批量值分批次获取）
	 * @param redisData 缓存数据的dto
	 * @param date 数据日期
	 * @return dto
	 */
	public CacheDataModel setRedisData(CacheDataModel redisData, Date date)
	{
		if (redisData == null)
			redisData = new CacheDataModel();
		redisData.setDataList(null);
		String redisKey = this.getRedisKey(date);
		long size = cacheHandler.getListCacheSize(redisKey);
		if (size > 0)
		{
			long start = redisData.getStartIdx();
			long end = start + BATCH_SIZE;
			if (start > size)
				return redisData;
			if (end > size)
				end = size;
			List<JSONObject> list = cacheHandler.getList(redisKey, start, end,
					JSONObject.class);
			redisData.setDataList(list);
			redisData.setStartIdx(end + 1);
		}
		return redisData;
		
	}
	
	/**
	 * 将数据集转成csv中的一行
	 * @param dataList 数据集
	 * @return csv行字符串
	 */
	public String list2CSVLine(List<Object> dataList)
	{
		return StringUtil.list2CSVLine(dataList, SepratorUtil.SEP_COMMA_EN);
	}
	
	public String list2CSVLine(List<Object> dataList, String sep)
	{
		return StringUtil.list2CSVLine(dataList, sep);
	}
	
	/**
	 * 若全部为非空，则校验通过
	 * @param target 目标对象
	 * @param fields 校验字段
	 */
	public void validateAllNotEmpty(JSONObject target, String... fields)
	{
		if (target == null || target.isEmpty())
			throw new SpiderException(
					SpiderExceptionCode.DataInvalideException);
		for (String val : fields)
			if ((!target.has(val))
					|| StringUtils.isEmpty(target.getString(val)))
				throw new SpiderException(
						SpiderExceptionCode.DataInvalideException,
						target.toString());
	}
	
	/**
	 * 任意为非空，则校验通过
	 * @param values 数据
	 * @return 校验结果
	 */
	protected void validateOneNotEmpty(JSONObject target, String... fields)
	{
		if (target == null || target.isEmpty())
			throw new SpiderException(
					SpiderExceptionCode.DataInvalideException);
		for (String val : fields)
			if (target.has(val) && StringUtils.isNotEmpty(val))
				return;
		throw new SpiderException(SpiderExceptionCode.DataInvalideException,
				target.toString());
	}
	
	/**
	 * 转储数据源的缓存key
	 * @param date 数据日期
	 * @return 缓存key
	 */
	protected abstract String getRedisKey(Date date);
	
	/**
	 * 数据转储处理（单个记录）
	 * @param target 缓存数据
	 * @param cacheData 处理过程中的缓存数据
	 * @param date 数据日期
	 * @return 转储后的格式（csv中的一行）
	 */
	public abstract String process(JSONObject target, CacheDataModel cacheData,
			Date date);
	
	/**
	 * 获取转储的数据类别
	 * @return 类别标识
	 */
	public abstract String getDataType();
	
	/**
	 * 获取转储任务类型
	 * @return 类别标识
	 */
	public abstract String getTaskType();
	
	/**
	 * 处理完当前批次后要做的工作
	 * @param cacheData 处理数据
	 */
	public void afterBatch(CacheDataModel cacheData)
	{
		
	}
	
	public SpiderLogModel getTaskLog()
	{
		return taskLog;
	}
	
	public void setTaskLog(SpiderLogModel taskLog)
	{
		this.taskLog = taskLog;
	}
	
}
